import os
import unittest
from typing import re

from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy

from 水质.utils.Logger import logger
from 水质.utils.click import allowPermission, clickText
from 水质.个人中心.个人中心 import test_msg
from 水质.地表水监测.实时地图 import test_map_filter
from 水质.流量监测.三线检定报表 import checkTableThreeCheck
from 水质.流量监测.断面水位面积差算表 import checkTableArea
from 水质.流量监测.水位报表 import checkTableWater
from 水质.流量监测.流量报表 import checkTableFlux
from 水质.登录.登录 import input_account

capabilities = dict(
    platformName='Android',
    automationName='uiautomator2',
    deviceName='333968a19905',
    appPackage='com.standards.oceanprotect',
    appActivity='com.standards.oceanprotect.module.common.GuideActivity',

)

appium_server_url = 'http://localhost:4723'


def adb_desired_info():
    # 获取模拟器操作系统版本号：Android 10.0
    platform_ver = os.popen("adb shell getprop ro.build.version.release").readline()
    # 获取模拟器设备名称
    device_name = os.popen("adb -d shell getprop ro.product.model").readline()
    # 获取模拟器打开的App程序包信息
    app_resume = os.popen('adb shell dumpsys activity | findstr "mResume"').readline()
    if app_resume:
        # 从包信息中正则提取App包名
        app_package = re.split('[\s/]', app_resume)[7]
        # app_activity = os.popen(f'adb shell monkey -p {app_package} -vvv 1 | findstr "cmp"').readline() # 不推荐(可能出现多行)
        # 根据包名获取App真实主界面名称
        app_activity = os.popen(
            f'adb shell cmd package resolve-activity --brief {app_package} | findstr "Activity"').readline()
        # 打印日志并返回结果
        return {
            'platformName': 'Android',  # 默认Android系统平台
            'platformVersion': _.blog(platform_ver, "系统版本："),  # 模拟器版本号
            'deviceName': _.blog(device_name, "设备名称："),  # 设备名称(Android系统任意名称)
            'appPackage': _.blog(app_package, "程序包名："),  # APP包名(Package)
            'appActivity': _.blog(app_activity.split("/")[1], "程序界面："),  # App主界面(Activity)
            'unicodeKeyboard': True,  # 使用模拟器输入法(输入中文:True)
            'resetKeyboard': True,  # 执行完程序恢复原来输入法
            'newCommandTimeout': 30,  # Appium Server接收下一条命令的超时时间(单位:s)
            'waitForIdleTimeout': 700,  # 设置等待页面响应超时时间(单位:ms)
            'automationName': 'UiAutomator2',  # 采用goolge提供的移动端UI自动化框架
            # 'automationName': 'Appium',     # Appium基于UiAutomator2+XCUITest底层库实现的移动端UI自动化框架
            'noReset': True,  # 不要重置App(真机测试建议不清除登录状态)
            'skipLogCapture': True  # 跳过捕获日志，可能会提高网络性能，但日志相关命令无效，默认False
            # 'app': r'd:\apk\dmall.apk',     # 将本地App文件安装到模拟器进行自动化操作
        }


class TestAppium(unittest.TestCase):
    def setUp(self) -> None:
        self.driver = webdriver.Remote(appium_server_url, options=UiAutomator2Options().load_capabilities(capabilities))

    def tearDown(self) -> None:
        if self.driver:
            self.driver.quit()

    def testDeviceInfo(self) -> None:
        logger.log(adb_desired_info())

    def test_agree_permission(self) -> None:
        allowPermission(self.driver)
        input_account(self)

    def test_flux_module(self) -> None:
        input_account(self)
        clickText(self.driver, "流量监测")
        clickText(self.driver, "数据报表")
        #checkTableFlux(self.driver)
        #checkTableWater(self.driver)
        checkTableArea(self.driver)
        checkTableThreeCheck(self.driver)
        logger.log("test_flux_module：测试完毕")

    def test_surface_water(self) -> None:
        input_account(self)
        clickText(self.driver, "地表水监测")
        while True:
            try:
                test_map_filter(self.driver)
                logger.log("test_surface_water：测试完毕")
                break  # 如果测试成功，跳出循环
            except Exception as e:
                logger.log("test_map_filter 测试失败，错误信息：" + str(e))
                logger.log("正在重新执行 test_surface_water 测试...")

    def test_center(self) -> None:
        input_account(self)
        clickText(self.driver, "个人中心")
        test_msg(self.driver)
        logger.log("test_center：测试完毕")


if __name__ == '__main__':
    unittest.main()
